package com.wgy.day29多线程.线程状态之等待唤醒状态;

/*
进入到TimeWaiting(计时等待)有2种方式
1.使用sleep(Long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/blocked状态
2.使用wait(Long m)方法,wait方法如果早毫秒值结束之后,还没有被notify唤醒,线程就会自动醒来,线程睡醒进入到Runnable/blocked状态

*/
public class Demo02WaitAndNotify {
    public static void main(String[] args) {
        //创建一个锁对象
        Object obj = new Object();
        //创建一个顾客线程
        new Thread() {
            @Override
            public void run() {
                synchronized (obj) {
                    System.out.println("告知老板要的包子的种类和数量");
                    //调用wait方法,进入等待状态(无线等待,除非被唤醒)
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //唤醒之后执行的代码
                    System.out.println("包子已经做好了,开吃!");
                    System.out.println("===============");
                }


            }
        }.start();


        //创建一个老板线程
        new Thread() {
            @Override
            public void run() {

                //花了5秒钟时间做包子
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //包子做好,通知顾客,保证等待和唤醒的线程只能有一个执行,需要用到同步技术
                synchronized (obj){
                    System.out.println("老板5秒之后做好了包子,告知顾客可以吃包子了");
                    obj.notify();//唤醒在此监视器上等待的一个线程,随机唤醒一个
                 //   obj.notifyAll();//唤醒在此监视器上等待的所有线程
                }
            }
        }.start();

    }


}
